export default {
	install(app) {
		// 网站 url
		app.config.globalProperties.$_url = () => {
			return "https://www.xxx.co"
		};
		
		// App配置文件
		// #ifdef APP-PLUS
		app.config.globalProperties.$_configFile = () => {
			return "https://www.xxx.co/diy/"
		};
		// #endif
		
		// 微信小程序配置文件
		// #ifdef MP-WEIXIN
		app.config.globalProperties.$_configFile = () => {
			return "https://www.xxx.co/diy/"
		};
		// #endif
		
		// H5配置文件
		// #ifdef WEB
		app.config.globalProperties.$_configFile = () => {
			return "https://www.xxx.co/diy/"
		};
		// #endif
		
		// 除了App、微信小程序、H5三个平台以外使用的配置文件
		// #ifndef APP-PLUS || MP-WEIXIN || WEB
		app.config.globalProperties.$_configFile = () => {
			return "https://www.xxx.co/diy/"
		};
		// #endif
		
		// 开发模式 如果是 false，则diy配置文件会有缓存，如果是true则没有缓存
		app.config.globalProperties.$_developMode = () => {
			return true
		};
		// 网站密钥
		app.config.globalProperties.$_appKey = () => {
			return {
				"appID": "appID",
				"appSecret": "appSecret",
				"platform": 4,
				"contentFormat": "html"
			}
		};
		// header
		app.config.globalProperties.$_fresnsHeader = () => {
			const clientDeviceInfo = uni.getStorageSync('clientDeviceInfo') ? uni.getStorageSync('clientDeviceInfo') : "eyJuZXR3b3JrSXB2NCI6ICIxMjcuMC4wLjAifQ";
			const accountAuthToken = uni.getStorageSync('accountAuthToken') ? JSON.parse(uni.getStorageSync('accountAuthToken')) : false;
			const appID = app.config.globalProperties.$_appKey().appID,
				appSecret = app.config.globalProperties.$_appKey().appSecret,
				platform = app.config.globalProperties.$_appKey().platform,
				contentFormat = app.config.globalProperties.$_appKey().contentFormat;
			const timestamp = Date.now();
			if (!accountAuthToken) {
				let string = `X-Fresns-App-Id=${appID}&X-Fresns-Client-Platform-Id=${platform}&X-Fresns-Client-Version=1.0.0&X-Fresns-Signature-Timestamp=${timestamp}&AppKey=${appSecret}`;
				let signature = app.config.globalProperties.$_SHA256(string);
				return {
					"X-Fresns-Space-Id": "",
					"X-Fresns-App-Id": appID,
					"X-Fresns-Client-Platform-Id": platform,
					"X-Fresns-Client-Version": "1.0.0",
					"X-Fresns-Client-Device-Info": clientDeviceInfo,
					"X-Fresns-Client-Timezone": "",
					"X-Fresns-Client-Lang-Tag": "",
					"X-Fresns-Client-Content-Format": contentFormat,
					"X-Fresns-Aid": "",
					"X-Fresns-Aid-Token": "",
					"X-Fresns-Uid": "",
					"X-Fresns-Uid-Token": "",
					"X-Fresns-Signature": signature,
					"X-Fresns-Signature-Timestamp": timestamp
				}
			}
			if (accountAuthToken) {
				let string = `X-Fresns-Aid=${accountAuthToken.aid}&X-Fresns-Aid-Token=${accountAuthToken.aidToken}&X-Fresns-App-Id=${appID}&X-Fresns-Client-Platform-Id=${platform}&X-Fresns-Client-Version=1.0.0&X-Fresns-Signature-Timestamp=${timestamp}&X-Fresns-Uid=${accountAuthToken.uid}&X-Fresns-Uid-Token=${accountAuthToken.uidToken}&AppKey=${appSecret}`;
				let signature = app.config.globalProperties.$_SHA256(string);
				return {
					"X-Fresns-Space-Id": "",
					"X-Fresns-App-Id": appID,
					"X-Fresns-Client-Platform-Id": platform,
					"X-Fresns-Client-Version": "1.0.0",
					"X-Fresns-Client-Device-Info": clientDeviceInfo,
					"X-Fresns-Client-Timezone": "",
					"X-Fresns-Client-Lang-Tag": "",
					"X-Fresns-Client-Content-Format": contentFormat,
					"X-Fresns-Aid": accountAuthToken.aid,
					"X-Fresns-Aid-Token": accountAuthToken.aidToken,
					"X-Fresns-Uid": accountAuthToken.uid,
					"X-Fresns-Uid-Token": accountAuthToken.uidToken,
					"X-Fresns-Signature": signature,
					"X-Fresns-Signature-Timestamp": timestamp
				}
			}
		};
		// 插件 accessToken 生成
		app.config.globalProperties.$_extensionPluginAccessToken = () => {
			const clientDeviceInfo = uni.getStorageSync('clientDeviceInfo') ? uni.getStorageSync('clientDeviceInfo') : "eyJuZXR3b3JrSXB2NCI6ICIxMjcuMC4wLjAifQ";
			const accountAuthToken = uni.getStorageSync('accountAuthToken') ? JSON.parse(uni.getStorageSync('accountAuthToken')) : false;
			const appID = app.config.globalProperties.$_appKey().appID,
				appSecret = app.config.globalProperties.$_appKey().appSecret,
				platform = app.config.globalProperties.$_appKey().platform,
				contentFormat = app.config.globalProperties.$_appKey().contentFormat;
			const timestamp = Date.now();
			if (!accountAuthToken) {
				let string = `X-Fresns-App-Id=${appID}&X-Fresns-Client-Platform-Id=${platform}&X-Fresns-Client-Version=1.0.0&X-Fresns-Signature-Timestamp=${timestamp}&AppKey=${appSecret}`;
				let signature = app.config.globalProperties.$_SHA256(string);
				let b = `{"X-Fresns-Sid":"","X-Fresns-App-Id":"${appID}","X-Fresns-Client-Platform-Id":${platform},"X-Fresns-Client-Version":"1.0.0","X-Fresns-Client-Device-Info":"${clientDeviceInfo}","X-Fresns-Client-Lang-Tag":"zh-Hans","X-Fresns-Client-Timezone":"+8","X-Fresns-Client-Content-Format":"${contentFormat}","X-Fresns-Aid":"${accountAuthToken ? accountAuthToken.aid : ''}","X-Fresns-Aid-Token":"${accountAuthToken ? accountAuthToken.aidToken : ''}","X-Fresns-Uid":${accountAuthToken ? accountAuthToken.uid : null},"X-Fresns-Uid-Token":"${accountAuthToken ? accountAuthToken.uidToken : ''}","X-Fresns-Signature":"${signature}","X-Fresns-Signature-Timestamp":${timestamp}}`;
				let c = app.config.globalProperties.$_stringToBase64(b);
				let d = encodeURIComponent(c);
				return d;
			}
			if (accountAuthToken) {
				let string = `X-Fresns-Aid=${accountAuthToken.aid}&X-Fresns-Aid-Token=${accountAuthToken.aidToken}&X-Fresns-App-Id=${appID}&X-Fresns-Client-Platform-Id=${platform}&X-Fresns-Client-Version=1.0.0&X-Fresns-Signature-Timestamp=${timestamp}&X-Fresns-Uid=${accountAuthToken.uid}&X-Fresns-Uid-Token=${accountAuthToken.uidToken}&AppKey=${appSecret}`;
				let signature = app.config.globalProperties.$_SHA256(string);
				let b = `{"X-Fresns-Sid":"","X-Fresns-App-Id":"${appID}","X-Fresns-Client-Platform-Id":${platform},"X-Fresns-Client-Version":"1.0.0","X-Fresns-Client-Device-Info":"${clientDeviceInfo}","X-Fresns-Client-Lang-Tag":"zh-Hans","X-Fresns-Client-Timezone":"+8","X-Fresns-Client-Content-Format":"${contentFormat}","X-Fresns-Aid":"${accountAuthToken ? accountAuthToken.aid : ''}","X-Fresns-Aid-Token":"${accountAuthToken ? accountAuthToken.aidToken : ''}","X-Fresns-Uid":${accountAuthToken ? accountAuthToken.uid : null},"X-Fresns-Uid-Token":"${accountAuthToken ? accountAuthToken.uidToken : ''}","X-Fresns-Signature":"${signature}","X-Fresns-Signature-Timestamp":${timestamp}}`;
				let c = app.config.globalProperties.$_stringToBase64(b);
				let d = encodeURIComponent(c);
				return d;
			}
		};
		// 交互设备信息获取
		app.config.globalProperties.$_commonIpInfo = () => {
			uni.request({
				url: app.config.globalProperties.$_url() + "/api/fresns/v1/common/ip-info",
				method: "GET",
				success: (res) => {
					let d = { "networkIpv4": res.data.data.networkIpv4 }
					let e = app.config.globalProperties.$_stringToBase64(JSON.stringify(d));
					uni.setStorageSync('clientDeviceInfo', e);
				}
			})
		};
		// 字符串转 Base64
		app.config.globalProperties.$_stringToBase64 = (str) => {
			let c1, c2, c3;
			let base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
			let i = 0,
				len = str.length,
				string = '';

			while (i < len) {
				c1 = str.charCodeAt(i++) & 0xff;
				if (i == len) {
					string += base64EncodeChars.charAt(c1 >> 2);
					string += base64EncodeChars.charAt((c1 & 0x3) << 4);
					string += "==";
					break;
				}
				c2 = str.charCodeAt(i++);
				if (i == len) {
					string += base64EncodeChars.charAt(c1 >> 2);
					string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
					string += base64EncodeChars.charAt((c2 & 0xF) << 2);
					string += "=";
					break;
				}
				c3 = str.charCodeAt(i++);
				string += base64EncodeChars.charAt(c1 >> 2);
				string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
				string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
				string += base64EncodeChars.charAt(c3 & 0x3F)
			}
			return string
		};
		// 网络请求 request
		app.config.globalProperties.$_request = (method, url, data = {}, success) => {
			uni.request({
				url: app.config.globalProperties.$_url() + url,
				method: method,
				header: app.config.globalProperties.$_fresnsHeader(),
				data: {
					...data
				},
				success: (res) => {
					if (
						res.data.code === 31502 ||
						res.data.code === 31503 ||
						res.data.code === 31504 ||
						res.data.code === 31505 ||
						res.data.code === 31602 ||
						res.data.code === 31603
					) {
						uni.removeStorageSync('accountAuthToken');
						// #ifdef APP-PLUS
						plus.runtime.restart();
						// #endif
						
						// #ifdef WEB
						location.reload(true);
						// #endif
						
						// #ifdef MP-WEIXIN
						uni.showToast({
							title: '登录过期，请返回首页下拉刷新或重新进入',
							icon: 'none',
							duration: 2000
						});
						// #endif
						
						return;
					}
					success(res);
				},
				fail: (res) => {
					uni.showToast({
						title: res.errMsg,
						icon: 'none',
						duration: 2000
					});
				}
			});
		};
		// 路由跳转
		app.config.globalProperties.$_to = (pageUrl) => {
			uni.navigateTo({
				url: "/pages/" + pageUrl
			});
		};
		// 过滤所有html
		app.config.globalProperties.$_filterHtml = (html) => {
			let str = html;
			str = str.replace(/<img[^>]+class="fresns_sticker"[^>]*>/g, '[表情]');
			str = str.replace(/<.*?>/g, "");
			str = str.replace(/\[file:[^\[\]]+\]/g, "");
			// 手动替换常见HTML实体为字符
			str = str
				.replace(/&lt;/g, '<')    // 小于号
				.replace(/&gt;/g, '>')    // 大于号
				.replace(/&amp;/g, '&')   // 和号
				.replace(/&quot;/g, '"')  // 双引号
				.replace(/&apos;/g, "'")  // 单引号
				.replace(/&nbsp;/g, ' ')  // 非换行空格
				.replace(/&ldquo;/g, '“') // 左双引号
				.replace(/&rdquo;/g, '”') // 右双引号
				.replace(/&lsquo;/g, '‘') // 左单引号
				.replace(/&rsquo;/g, '’') // 右单引号
			return str
		};
		// 内容监听替换
		app.config.globalProperties.$_content = (html) => {
			// 匹配话题
			html = html.replace(
			  /<a\s+href="(?:[^"]*\/)?([^"]+)"\s+class="fresns_hashtag"\s+target="_blank">([\s\S]*?)<\/a>/gi,
			  '<a href="/pages/hashtag/detail?hid=$1" class="fresns_hashtag" style="display: inline-block;"><div style="display: inline-block;text-decoration:none;position: relative;padding-right:20rpx;">$2<span class="iconfont icon-huatifuhao" style="display: inline-block;position: absolute;top: 2rpx;right: 0;font-size: 22rpx;line-height: 22rpx;"></span></div></a>'
			);
			// 使用正则表达式替换<a>标签中的 #
			html = html.replace(/(<a[^>]*>)(.*?)(<\/a>)/g, function(match, startTag, content, endTag) {
			    // 对 content 部分进行替换
			    let replacedContent = content.replace(/#/g, '');
			    // 返回替换后的<a>标签内容
			    return startTag + replacedContent + endTag;
			});
			// 匹配艾特
			html = html.replace(
			  /<a\s+href="(?:[^"]*\/)?([^"]+)"\s+class="fresns_mention"\s+target="_blank">@([\s\S]*?)<\/a>/gi,
			  '<a href="/pages/user/detail?uid=$1">@$2</a>'
			);
			// 增加表情图样式
			html = html.replace(
			  /<img\s+src="([^"]+)"\s+class="fresns_sticker"\s+alt="([\s\S]*?)"\s*\/?>/gi,
			  '<img src="$1" alt="$2" class="fresns_sticker" style="display: inline-block;max-width: 50rpx;vertical-align: middle;margin:0 10rpx;"/>'
			);
			// 替换帖子为客户端打开
			let url = app.config.globalProperties.$_url();
			let regex = /<a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1([^>]*)>(.*?)<\/a>/g;
			html = html.replace(regex, (match, quote, href, afterHref, textContent) => {
				// 检查 href 是否以 url 开头
				if (href.startsWith(url)) {
					// 提取 wgMYUbkA
					let pid = href.split('/').pop();
					// 替换 href 中的部分
					let newHref = `/pages/post/detail?pid=${pid}`;
					return `<a href="${newHref}"${afterHref}>${textContent}</a>`;
				} else {
					return match; // 不需要替换的情况
				}
			});
			
			return html
		};
		// 图片预览
		app.config.globalProperties.$_picturePreview = (index, item) => {
			let img = [];
			for (let i = 0; i < item.length; i++) {
				img.push(item[i].imageBigUrl)
			}
			uni.previewImage({
				current: index,
				urls: img
			})
		};
		// 是否登录
		app.config.globalProperties.$_isLogin = () => {
			if (uni.getStorageSync('accountAuthToken')) {
				return true
			} else {
				return false
			}
		};
		// SHA256 算法实现
		app.config.globalProperties.$_SHA256 = (s) => {
			var chrsz = 8;
			var hexcase = 0;
			function safe_add(x, y) {
				var lsw = (x & 0xFFFF) + (y & 0xFFFF);
				var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
				return (msw << 16) | (lsw & 0xFFFF);
			}
			function S(X, n) { return (X >>> n) | (X << (32 - n)); }
			function R(X, n) { return (X >>> n); }
			function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
			function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }

			function Sigma0256(x) {
				return (S(x, 2) ^ S(x, 13) ^ S(x, 22));
			}

			function Sigma1256(x) {
				return (S(x, 6) ^ S(x, 11) ^ S(x, 25));
			}

			function Gamma0256(x) {
				return (S(x, 7) ^ S(x, 18) ^ R(x, 3));
			}

			function Gamma1256(x) {
				return (S(x, 17) ^ S(x, 19) ^ R(x, 10));
			}

			function core_sha256(m, l) {
				var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1,
					0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74,
					0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC,
					0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8,
					0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138,
					0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1,
					0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
					0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F,
					0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB,
					0xBEF9A3F7, 0xC67178F2);
				var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C,
					0x1F83D9AB, 0x5BE0CD19);
				var W = new Array(64);
				var a, b, c, d, e, f, g, h, i, j;
				var T1, T2;
				m[l >> 5] |= 0x80 << (24 - l % 32);
				m[((l + 64 >> 9) << 4) + 15] = l;
				for (var i = 0; i < m.length; i += 16) {
					a = HASH[0];
					b = HASH[1];
					c = HASH[2];
					d = HASH[3];
					e = HASH[4];
					f = HASH[5];
					g = HASH[6];
					h = HASH[7];
					for (var j = 0; j < 64; j++) {
						if (j < 16) W[j] = m[j + i];
						else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j -
							15])), W[j - 16]);
						T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
						T2 = safe_add(Sigma0256(a), Maj(a, b, c));
						h = g;
						g = f;
						f = e;
						e = safe_add(d, T1);
						d = c;
						c = b;
						b = a;
						a = safe_add(T1, T2);
					}
					HASH[0] = safe_add(a, HASH[0]);
					HASH[1] = safe_add(b, HASH[1]);
					HASH[2] = safe_add(c, HASH[2]);
					HASH[3] = safe_add(d, HASH[3]);
					HASH[4] = safe_add(e, HASH[4]);
					HASH[5] = safe_add(f, HASH[5]);
					HASH[6] = safe_add(g, HASH[6]);
					HASH[7] = safe_add(h, HASH[7]);
				}
				return HASH;
			}

			function str2binb(str) {
				var bin = Array();
				var mask = (1 << chrsz) - 1;
				for (var i = 0; i < str.length * chrsz; i += chrsz) {
					bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32);
				}
				return bin;
			}

			function Utf8Encode(string) {
				string = string.replace(/\r\n/g, "\n");
				var utftext = "";
				for (var n = 0; n < string.length; n++) {
					var c = string.charCodeAt(n);
					if (c < 128) {
						utftext += String.fromCharCode(c);
					} else if ((c > 127) && (c < 2048)) {
						utftext += String.fromCharCode((c >> 6) | 192);
						utftext += String.fromCharCode((c & 63) | 128);
					} else {
						utftext += String.fromCharCode((c >> 12) | 224);
						utftext += String.fromCharCode(((c >> 6) & 63) | 128);
						utftext += String.fromCharCode((c & 63) | 128);
					}
				}
				return utftext;
			}

			function binb2hex(binarray) {
				var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
				var str = "";
				for (var i = 0; i < binarray.length * 4; i++) {
					str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) +
						hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);
				}
				return str;
			}
			s = Utf8Encode(s);
			return binb2hex(core_sha256(str2binb(s), s.length * chrsz));
		};
		// 自动替换话题
		app.config.globalProperties.$_matchReplaceHashtag = (content, key, format = 2) => {
			const regex = new RegExp(`(?<!#)(${key.join('|')})(?!#)`, 'gi');
			if (format == 1) {
				return content.replace(regex, '#$&');
			}
			if (format == 2) {
				return content.replace(regex, '#$&#');
			}
		};
		// 随机颜色
		app.config.globalProperties.$_getRandomColor = () => {
			const r = Math.floor(Math.random() * 256);
			const g = Math.floor(Math.random() * 256);
			const b = Math.floor(Math.random() * 256);
			return `rgb(${r},${g},${b})`;
		};
		// 是否有通知
		app.config.globalProperties.$_isNotification = () => {
			// 先判断私聊对话是否有未读
			uni.request({
				url:app.config.globalProperties.$_url() + "/api/fresns/v1/conversation/list",
				method:"GET",
				header:app.config.globalProperties.$_fresnsHeader(),
				data:{
					"filterUserType":"whitelist",
					"filterUserKeys":"uid"
				},
				success: (res) => {
					const hasUnreadMessages = res.data.data.list.some(item => item.unreadCount !== 0);
					// 如果有未读，直接提示
					if(hasUnreadMessages){
						uni.showTabBarRedDot({
							index: 3
						})
					}else{
						uni.request({
							url:app.config.globalProperties.$_url() + "/api/fresns/v1/notification/list",
							method:"GET",
							header:app.config.globalProperties.$_fresnsHeader(),
							data:{
								"status":0,
								"filterUserType":"whitelist",
								"filterUserKeys":"uid",
								"filterInfoType":"whitelist",
								"filterInfoKeys":"pid"
							},
							success: (ref) => {
								if(ref.data.data.list.length){
									uni.showTabBarRedDot({
										index: 3
									})
								}else{
									uni.hideTabBarRedDot({
										index: 3
									})
								}
							}
						})
					}
				}
			})
		};
	}
};